perm filename SCAN.MAC[LSP,SYS] blob sn#091908 filedate 1974-03-15 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE SCAN -- GENERAL PURPOSE ADAPTER FOR LISP SCANNER
C00004 00003	
C00006 00004	
C00008 ENDMK
CāŠ—;
TITLE SCAN -- GENERAL PURPOSE ADAPTER FOR LISP SCANNER

A=1
B=2
C=3
R=13
T=6
P=14

CR=15
LF=12
TAB=11

IGCRLF=32
INUM0=577777
OPDEF CALLF [36B8]

EXTERNAL CHRTAB,IGSTRT,RATOM,OLDCH,FIX1A,NOINFG,SCNVAL,READ,NUMVAL

INTERNAL SCAN,UNTYI,SCANSET,SCANRESET,SCANINIT,LETTER,IGNORE,SREAD
INTERNAL SCANFNSET,DELLIM,MODCHR

SCANFNSET:
	MOVEM	1,SCNFN#
	POPJ	P,

SCAN:	SETOM NOINFG
	PUSHJ P,RATOM
	SKIPA
	PUSHJ P,FIX1A
	MOVEM A,SCNVAL
	MOVEI A,INUM0(R)
	SKIPN C,SCNFN		;MONITORING INPUT?
	 JRST	 CPOPJ
	MOVE	B,SCNVAL
	CALLF	2,(C)		;(RETURN SCANFN TYPE VAL)
CPOPJ:	POPJ P,

UNTYI:	SUBI A,INUM0
	MOVEM A,OLDCH
	JRST FIX1A

OLDSCN:	IGCRLF	;IGSTRT
	LF	;IGEND
	POINT 4,CHRTAB(A),5	;RATFLD
	POINT 2,CHRTAB(A),10	;STRFLD
	POINT 3,CHRTAB(A),13	;IDFLD

IGST2:	0	;IGSTRT
IGEND2:	0	;IGEND
RATF2:	POINT 4,CHRTAB(A),29	;RATFLD
STRF2:	POINT 2,CHRTAB(A),31	;STRFLD
IDF2:	POINT 3,CHRTAB(A),34	;IDFLD

SCANSET:	SKIPA A,[XWD IGST2,IGSTRT]
SCANRESET:	MOVE A,[XWD OLDSCN,IGSTRT]
	BLT A,IGSTRT+4
FALSE:	MOVEI A,0
	POPJ P,

SCANINIT:	SUBI A,INUM0
	SUBI B,INUM0
	SUBI C,INUM0
	SUBI C+1,INUM0
	SUBI C+2,INUM0
	MOVEM A,IGST2	;IGSTRT
	MOVEM B,IGEND2	;IGEND
	PUSH P,C	;STRBEG
	PUSH P,C+1	;STREND
	PUSH P,C+2	;SLASHIFY
	MOVEI B,2
	MOVEI C,3
	MOVEI A,176
	DPB B,RATF2
	DPB C,STRF2
	DPB B,IDF2
	SOJG A,.-3
	MOVE A,[XWD "A"-"Z"-1,"A"]
	MOVEI B,5
	MOVEI C,4
	DPB B,RATF2
	DPB C,IDF2
	AOBJN A,.-2
	MOVE A,[XWD "a"-"z"-1,"a"]
	DPB B,RATF2
	DPB C,IDF2
	AOBJN A,.-2
	MOVE A,[XWD "0"-"9"-1,"0"]
	MOVEI B,8
	DPB B,RATF2
	DPB C,IDF2
	AOBJN A,.-2
	POP P,A	;SLASHIFY
	MOVEI B,3
	DPB B,IDF2
	DPB C,RATF2
	POP P,A	;STREND
	MOVEI B,2
	DPB B,STRF2
	POP P,A	;STRBEG
	MOVEI B,9
	DPB B,RATF2
	MOVE A,IGST2
	MOVEI B,0
	DPB B,RATF2
	DPB B,STRF2
	DPB B,IDF2
	MOVEI B,1
	MOVEI A,0	;NULL
	DPB B,RATF2
	DPB B,IDF2
	DPB B,STRF2
	MOVEI A,"."
	MOVEI B,7
	DPB B,RATF2
	JRST FALSE

LETTER:	SUBI A,INUM0
	MOVEI B,5
	MOVEI C,4
	DPB C,IDF2
LET2:	DPB B,RATF2
	JRST FALSE

IGNORE:	SUBI A,INUM0
	MOVEI B,3
	JRST LET2

DELLIM: SUBI A,INUM0	;WHATEVER IT WAS IS NOW A DELIMITER
	MOVEI B,2
	JRST LET2

MODCHR:	SUBI A,INUM0	;CHAR TO BE MODIFIED
	PUSH P,A
	MOVE A,CHRTAB(A);NEW VALUE IS OLD, IF 2D ARG NIL
	JUMPE B,JSTRET
	MOVE A,B	;NEW TABLE ENTRY
	PUSHJ P,NUMVAL	;GET REAL VALUE OF NEW VALUE
JSTRET:	POP P,B		;CHAR BACK
	EXCH A,CHRTAB(B);STORE NEW VALUE (OR OLD), RETURN OLD
	JRST FIX1A	;RETURN LISPIFIED OLD VALUE
	
	
SREAD:	MOVEI A,","	;IGNORE COMMAS FOR AWHILE.
	PUSHJ P,IGNORE+1
	PUSHJ P,READ	;READ AN S-EXPRESSION.
	PUSH P,A	;SAVE IT TEMPORARILY.
	MOVEI A,","
	MOVEI B,2
	DPB B,RATF2	;RESTORE COMMA AS A DELIMITER.
	POP P,A
	POPJ P,

END